/*
给定一个由非负整数组成的数组和一个整数m，
我们要把数组拆分成m个非空连续子数组，
使得这m个数组和的最大值在所有拆分方案中最小。
*/
#include<bits/stdc++.h>
using namespace std;

int n, m;
vector<int>nums;

int check(int value) // 检查当最大子数组和为value时，能否分成m个子数组
{
	int cnt = 1, sum = 0;
    for(int i = 0; i < n; ++i){
		if(nums[i] > value) return 0;

        if(sum + nums[i] > value){ // 开启新数组
            cnt++;
            sum = nums[i];
            if(cnt > m) return 0;
        }else sum += nums[i];
    }
    return cnt <= m;
}

int bin_search(int mx, int sum) // 二分查找
{
	int l = mx, r = sum;
    int res = r;
    while(l <= r){
        int mid = l + (r - l) / 2;
        if(check(mid)){ // 如果mid条件，尝试更小的值
            res = mid;
            r = mid - 1;
        }else { // 如果不满足条件，需要更大的值
			l = mid + 1;
		}
    }
    return res;
}

int solve()
{
	int sum = 0, mx = -0x7fffffff, res = 0;
	for (auto &item : nums) // 寻找数组中元素的最大值
	{
		sum += item;
		if (item > mx) mx = item;
	}
	res = bin_search(mx, sum);
	return res;
}

int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; ++ i) 
	{
		int x;
		cin >> x;
		nums.push_back(x);
	}
	int ans = solve();
	cout << ans << endl;
	return 0;
}